package preprocess;

import java.util.HashMap;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.util.Tool;
import org.apache.hadoop.util.ToolRunner;

import trouger.dmt.JoinTableRunner;
import trouger.dmt.JoinType;
import trouger.dmt.OutputRecordFilter;
import trouger.dmt.SourceRecordFilter;
import utils.Utils;
import extractor.UserExtendedExtractor;

public class DumpSearchLog implements Tool{
	
	public static String getSearchLogPath(String date) {
		//return "D:\\dev\\clickprediction\\data\\SearchLog";
		return Utils.rootDir + date + "/SearchLog/";
	}
	
	@Override 
	public Configuration getConf() {
		return null;
	}
	
	@Override
	public void setConf(Configuration conf) {
		
	}
	
	public static class SourceFilter implements SourceRecordFilter {
		@Override
		public boolean isValidRecord(int sourceIndex, String[] segment) {
			return sourceIndex == 1 || (segment.length == 26 && 
						segment[1].equals("s1") && 
						Utils.isValid(segment[4]));
		}
	}
	
	public static class OutputFilter implements OutputRecordFilter{
		private static HashMap<String, String> sortMap = Utils.sortFilterSetUp();
		@Override
		public boolean filterRecord(Object[] record) {
			if (sortMap.containsKey(record[12].toString()))
				record[12] = sortMap.get(record[12].toString());
			else
				record[12] = Utils.otherSort;	
			return true;  
		}
	}
	/*
	 * (non-Javadoc)
	 * SearchLog Table
	 * Path: /group/tbsc-dev/xzwang/clickprediction/$date/SearchDumpedLog/
	 * 1.user 32位id
	 * 2.Query 
	 * 3.bucket号（占用Query_type，如果对应不到bucket号，则为空，其它为0-19的值）
	 * 4.User 数字id
	 * 5.用户分类
	 * 6.Machine id
	 * 7.Session ID
	 * 8.点击时间
	 * 9.搜索的来源（1：TB站外来源，2：TB站内搜索结果页引流，3：TB站内首页用户主动搜索，4：新版搜索首页用户主动搜索，5：新版搜索相关搜索。现在该字段不一定是数字，有可能是域名）
	 * 10.搜索类目
	 * 11.上一步点击模块ID（智能导航或相关搜索）
	 * 12.排序,格式一转换
	 * 13.列表模式（大图、小图）
	 * 14.消保筛选
	 * 15.所在地筛选
	 * 16.结果数 01：违禁词过滤造成无结果 02：超时无结果 03：iSearch真实无结果 0：未知原因无结果
	 * 17.第几页
	 * 18.搜索属性
	 * 19.是否加载了智能导航模块（0：否，1：是）
	 * 20.是否加载了相关搜索模块（0：否，1：是）
	 * 21.是否加载了店铺模块（0：否，1：是）
	 * 22.产品搜索页面类型
	 * 23.是否加载了P4P模块（0：否，1：是）
	 * 24.豆腐块的结果数 (年后会新增该字段)
	 * 25.Tab类型 (0:未知，1：所有宝贝，2：人气，3：淘宝商城，4：二手)
	 * */	 
	@Override
	public int run(String[] args) throws Exception {		
		String userExtendedProfile = UserExtendedExtractor.getUserExtendedProfilePath(args[0]);
		String searchLog = "/group/taobao/taobao/dw/fact/" + args[0] + "/NewSearchLog/";
		String output = getSearchLogPath(args[0]);
		System.out.println("start job DumpClickLog...");
		System.out.println("userExtendedProfile: " + userExtendedProfile);
		System.out.println("searchLog: " + searchLog);
		System.out.println("output: " + output);
		if (Utils.exitSystem(args))
			return -1;
		JoinTableRunner r = new JoinTableRunner();
		r.addSourceTable(userExtendedProfile, "UTF-8", "\t");
		r.addSourceTable(searchLog, "UTF-8", "\t");
		r.addKeyGroup("1.1, 2.4");
		r.setJoinType(JoinType.InnerJoin);
		r.setSourceRecordFilterClass(SourceFilter.class);
		r.setOutputRecordFilterClass(OutputFilter.class);
		r.setMaxReduceItemCount(1000);
		r.setResultFieldsEx("1.3, " +
				"2.2, 2.3, 2.4, 2.5, " +
				"2.6, 2.7, 2.8, 2.9, 2.10, " +
				"2.11, 2.12, 2.13, 2.14, 2.15, " +
				"2.16, 2.17, 2.18, 2.19, 2.20, " +
				"2.21, 2.22, 2.23, 2.24, 2.25");
		r.setResultTable(output);
		r.run("DumpSearchLogJob");
		return 0;		 	
	}
	
	/**
	 * @param args
	 */
	public static void main(String[] args) throws Exception {
		Utils.checkArgs(args);
		
		// TODO Auto-generated method stub
		int res = ToolRunner.run(new DumpSearchLog(), args);
		System.exit(res);
	}
}
